/**
 * @file tal_zigbee_local_auto.h
 * @brief This is tal_zigbee_local_auto file
 * @version 1.0
 * @date 2021-09-10
 *
 * @copyright Copyright 2021-2022 Tuya Inc. All Rights Reserved.
 *
 */

#ifndef __TAL_ZIGBEE_LOCAL_AUTO_H__
#define __TAL_ZIGBEE_LOCAL_AUTO_H__

#include "tuya_cloud_types.h"
#include "tuya_error_code.h"
#include "tal_zigbee_local_auto_event.h"
#include "tal_zigbee_local_auto_action.h"

#ifdef __cplusplus
extern "C" {
#endif

/***********************************************************************
 ********************* constant ( macro and enum ) *********************
 **********************************************************************/
#define MAX_AUTO_NUM 32                 // 单个设备最多支持的联动总数 （由于一个设备最多有 32 个群组，因此这里设置最多 32 个联动）

#define AUTO_DISABLE        0           // 自动化失能
#define AUTO_ENABLE         1           // 自动化使能

#define RET_SUCCESS             0
#define RET_FAIL_FULL           1
#define RET_FAIL_FLASH          2
#define RET_FAIL                3


#define RET_FAIL_EVENT_ERROR    0x10
#define RET_FAIL_ACTION_ERROR   0x20
#define RET_NULL                0xff

/***********************************************************************
 ********************* struct ******************************************
 **********************************************************************/
/*
 * 自动化配置信息头部结构体--5bytes
 */
#pragma pack (1)
typedef struct {
    UINT16_T id;                             // 联动 ID, 为 0 表示该联动是作废的
    struct{
        UINT8_T enable:1;                    // 自动化使能与否
        UINT8_T rev:7;                       // 保留
    } attr;                                  // 条件序列属性
    UINT8_T crc8;                            // 共识指纹，采用 crc8(自动化配置信息条件序列部分+自动化配置信息动作序列部分)
    UINT8_T sum256;                          // 共识指纹，采用 sum(自动化配置信息条件序列部分+自动化配置信息动作序列部分)%256
} TAL_ZIGBEE_LOCAL_AUTO_HEAD_T;

/*
 * 自动化结构体
 */
typedef struct {
    TAL_ZIGBEE_LOCAL_AUTO_HEAD_T head;                 // 5bytes
    TAL_ZIGBEE_LOCAL_AUTO_EVENT_LIST_T event_list;     // 2bytes
    TAL_ZIGBEE_LOCAL_AUTO_ACTION_LIST_T action_list;   // 2bytes
} TAL_ZIGBEE_LOCAL_AUTO_T;                             // 9 bytes
#pragma pack ()

/*
 * 动作序列：
 *  - 数据结构：
 *      - 动作序列由一个一个子动作组成，每个子动作编号从 0 开始
 *      - 一个设备同时可以有多个动作序列，每个动作序列索引用联动 ID
 *  - 存储规则：（大大减小 RAM 占用，极限情况是最大支持的联动数 * 子动作的最大占 RAM 数）
 *      - 新增联动规则，将动作序列完整的直接存储在 flash 中
 *      - 删除联动规则，将动作序列完整的直接删除从 flash 中
 *      - 改动联动规则，将动作序列完整的直接替换在 flash 中
 *      - 动作引擎每次只用在全局变量中维护最新的需要执行的一个子动作
 *
 * 条件序列：
 *  - 数据结构：
 *      - 条件序列由一个一个子条件组成
 *      - 一个设备同时可以有多个条件序列，每个条件序列的索引用联动 ID
 *  - 存储规则：（需要占用 RAM，一个设备同时最多属于 32 个联动，每个联动子条件最多 3 个，每个子条件占用大约 10 字节，将会占用 1K 的 RAM）
 *
 */

//op == 0,delete; op == 1,add
typedef UINT8_T (*tal_zigbee_local_auto_sub_address_func_p)(UINT8_T op, UINT16_T address);

//目的地址(大端) ; cmd (命令) ; datas (数据); datas_len(数据长度)
typedef UINT8_T (*tal_zigbee_local_auto_send_msg_func_p)(UINT16_T dst_addr, UINT8_T cmd, UINT8_T *datas, UINT8_T datas_len);

/***********************************************************************
 ********************* variable ****************************************
 **********************************************************************/
extern TAL_ZIGBEE_LOCAL_AUTO_T local_autos[];

/***********************************************************************
 ********************* function ****************************************
 **********************************************************************/
/**
 * @brief tal_zigbee_local_auto_init, 传如可用的 1 sector (4KB) 的 A 区起始 flash 地址，和 B 区 (4KB) 的 flash 地址
 *
 * @param[in] flash_a_addr: flash_a_addr
 * @param[in] flash_b_addr: flash_b_addr
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_init(UINT32_T flash_a_addr, UINT32_T flash_b_addr);

/**
 * @brief tal_zigbee_local_auto_clear, 清除所有联动，删除 flash
 *
 * @param[in] param: none
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_clear(VOID_T);

/**
 * @brief tal_zigbee_local_auto_set_sub_address_func, 设置订阅地址用的函数
 *
 * @param[in] p_func: p_func
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_set_sub_address_func(tal_zigbee_local_auto_sub_address_func_p p_func);

/**
 * @brief tal_zigbee_local_auto_set_send_msg_func, 设置mesh发送数据的函数
 *
 * @param[in] p_func: p_func
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_set_send_msg_func(tal_zigbee_local_auto_send_msg_func_p p_func);

/**
 * @brief tal_zigbee_local_auto_cmd
 *
 * @param[in] src_addr: src_addr
 * @param[in] dst_addr: dst_addr
 * @param[in] cmd: cmd
 * @param[in] *params: *params
 * @param[in] len: len
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_cmd(UINT16_T src_addr, UINT16_T dst_addr, UINT8_T cmd, UINT8_T *params, UINT16_T len);

/**
 * @brief tal_zigbee_local_auto_run
 *
 * @param[in] param: none
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
VOID_T tal_zigbee_local_auto_run(VOID_T);

/**
 * @brief tal_zigbee_local_auto_print
 *
 * @param[in] param: none
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
VOID_T tal_zigbee_local_auto_print(VOID_T);


#ifdef __cplusplus
}
#endif

#endif /* __TAL_ZIGBEE_LOCAL_AUTO_H__ */

